package document

import (
	"context"
	"fmt"
	"github.com/cloudwego/eino/schema"
)

// DocumentTool 提供统一的文档处理接口
type DocumentTool struct{}

// NewDocumentTool 创建新的文档工具实例
func NewDocumentTool() *DocumentTool {
	return &DocumentTool{}
}

// Load 加载文档（统一接口）
func (dt *DocumentTool) Load(ctx context.Context, uri string) ([]*schema.Document, error) {
	return LoadDocument(ctx, uri)
}

// LoadFromS3 从S3加载文档
func (dt *DocumentTool) LoadFromS3(ctx context.Context, region, accessKey, secretKey, bucket, objectKey string) ([]*schema.Document, error) {
	return DownloadDocumentFromS3(ctx, region, accessKey, secretKey, bucket, objectKey)
}

// LoadFromLocal 从本地加载文档
func (dt *DocumentTool) LoadFromLocal(ctx context.Context, filePath string, useNameAsID bool) ([]*schema.Document, error) {
	return DownloadDocumentFromLocal(ctx, filePath, useNameAsID)
}

// LoadFromWeb 从Web加载文档
func (dt *DocumentTool) LoadFromWeb(ctx context.Context, urlStr string) ([]*schema.Document, error) {
	return DownloadDocumentFromWeb(ctx, urlStr, nil, nil)
}

// Parse 解析文档（自动选择解析器）
func (dt *DocumentTool) Parse(ctx context.Context, content string, format string, isPath bool) ([]*schema.Document, error) {
	return ParseDocument(ctx, content, format, isPath)
}

// ParseHTML 解析HTML文档
func (dt *DocumentTool) ParseHTML(ctx context.Context, htmlContent string, uri string, extraMeta map[string]any) (*schema.Document, error) {
	return nil, fmt.Errorf("HTML解析功能暂未实现，缺少html格式处理依赖")
}

// ParsePDF 解析PDF文档
func (dt *DocumentTool) ParsePDF(ctx context.Context, pdfPath string, toPages bool) ([]*schema.Document, error) {
	return nil, fmt.Errorf("PDF解析功能暂未实现，缺少pdf格式处理依赖")
}

// Split 分割文档（统一接口）
func (dt *DocumentTool) Split(ctx context.Context, docs []*schema.Document, splitType string, config interface{}) ([]*schema.Document, error) {
	return SplitDocument(ctx, docs, splitType)
}

// SplitRecursive 使用递归分割器分割文档
func (dt *DocumentTool) SplitRecursive(ctx context.Context, docs []*schema.Document, config *RecursiveSplitterConfig) ([]*schema.Document, error) {
	return SplitDocumentRecursive(ctx, docs)
}

// SplitSemantic 使用语义分割器分割文档
func (dt *DocumentTool) SplitSemantic(ctx context.Context, docs []*schema.Document, config *SemanticSplitterConfig) ([]*schema.Document, error) {
	return SplitDocumentSemantic(ctx, docs)
}

// SplitMarkdown 使用Markdown分割器分割文档
func (dt *DocumentTool) SplitMarkdown(ctx context.Context, docs []*schema.Document, config *MarkdownSplitterConfig) ([]*schema.Document, error) {
	return SplitDocumentMarkdown(ctx, docs)
}

// ProcessDocument 完整的文档处理流程
// 1. 加载文档
// 2. 解析文档（如果需要）
// 3. 分割文档
func (dt *DocumentTool) ProcessDocument(
	ctx context.Context,
	uri string,
	parseFormat string,
	splitType string,
	splitConfig interface{},
) ([]*schema.Document, error) {
	// 1. 加载文档
	docs, err := dt.Load(ctx, uri)
	if err != nil {
		return nil, fmt.Errorf("文档加载失败: %w", err)
	}

	// 2. 解析文档（如果指定了格式）
	if parseFormat != "" {
		// 这里简化处理，实际可能需要更复杂的逻辑
		// 例如根据加载的文档内容进行二次解析
		return nil, fmt.Errorf("二次解析功能暂未实现")
	}

	// 3. 分割文档
	if splitType != "" {
		docs, err = dt.Split(ctx, docs, splitType, splitConfig)
		if err != nil {
			return nil, fmt.Errorf("文档分割失败: %w", err)
		}
	}

	return docs, nil
}
